/**
 * 修改记录:
 * 25-09-11     郑朝军
 */

/**
 * uni.cxapp.FormSubmission
 * ZGIS-表单提交相关方法
 *
 * @class
 * @memberof    uni.cxapp.FormSubmission
 */
export default
{
  methods:
  {
    /**
     * 提交表单（支持自定义新增和更新方法）
     * @param {Object} options 选项
     * @param {Function} options.add 自定义新增方法
     * @param {Function} options.update 自定义更新方法
     */
    async commit(options = {})
    {
      if (this.isSubmitting)
      {
        return
      }

      try
      {
        this.isSubmitting = true

        // 检查表单数据
        if (Object.keys(this.internalAttMap).length === 0)
        {
          this.showErrorMsg('添加数据为空')
          return
        }

        // 提交前回调
        if (this.beforeCommit)
        {
          const canSubmit = await this.beforeCommit(this.internalAttMap)
          if (!canSubmit)
          {
            return
          }
        }

        // 数据校验
        if (!await this.checkData())
        {
          return
        }
        // 执行提交
        if (this.isAddMode())
        {
          console.log('----add', options.add)
          // ADD
          if (options.add)
          {
            options.add(this.internalAttMap)
          }
          else
          {
            await this.add()
          }
        }
        else if (this.isEditMode())
        {
          // MODIFY
          if (options.update)
          {
            options.update(this.internalAttMap)
          }
          else
          {
            await this.update()
          }
        }
        else if (this.isViewMode())
        {
          // QUERY - 查看模式不需要处理
        }
      }
      catch (error)
      {
        console.error('表单提交失败:', error)
        this.handleError(error)
      }
      finally
      {
        this.isSubmitting = false
      }
    },

    /**
     * 提交表单未验证表单数据
     * @param {Object} options 选项
     * @returns {Promise<void>}
     */
    async commitForm(options = {})
    {
      // 执行提交
      if (this.isAddMode())
      {
        // ADD
        if (options.add)
        {
          options.add()
        }
        else
        {
          await this.add()
        }
      }
      else if (this.isEditMode())
      {
        // MODIFY
        if (options.update)
        {
          options.update(this.internalAttMap)
        }
        else
        {
          await this.update()
        }
      }
    },

    /**
     * 暂存表单（默认存储到数据表中）
     * @returns {Promise<void>}
     */
    async submitCache()
    {
      if (this.onCache)
      {
        await this.onCache(this.internalAttMap)
      }
      else
      {
        await this.commitForm()
      }
    },

    /**
     * 新增记录（IAttController接口方法）
     * @returns {Promise<void>}
     */
    async add()
    {
      try
      {
        this.loadingMessage = '正在添加...'
        this.isLoading = true

        // 调用新增API，返回完整记录
        const result = await this.callAddApi(this.major, this.minor, this.internalAttMap, 1)

        // 更新状态为修改
        this.changeMode(uni.cxapp.CxConst.ATT_EDIT)

        this.showSuccessMsg('添加成功')

        // 处理提交后逻辑
        if (!this.isCustomPic)
        {
          await this.afterCommit(result)
        }
        else
        {
          this.internalAttMap = { ...result }
          if (this.onSuccess)
          {
            this.onSuccess(this.internalAttMap)
          }
        }
      }
      catch (error)
      {
        this.showErrorMsg(`添加失败：${error.message}`)
        if (this.onError)
        {
          this.onError(error, error.stack)
        }
        throw error
      }
      finally
      {
        this.isLoading = false
      }
    },

    /**
     * 更新记录（IAttController接口方法）
     * @returns {Promise<void>}
     */
    async update()
    {
      try
      {
        this.loadingMessage = '正在更新...'
        this.isLoading = true        
        // 调用更新API
        const result = await this.callUpdateApi(this.major, this.minor, this.internalAttMap)

        this.showSuccessMsg('更新成功')
        
        // 处理提交后逻辑
        if (!this.isCustomPic)
        {
          await this.afterCommit(result)
        }
        else
        {
          this.internalAttMap = { ...result }
          if (this.onSuccess)
          {
            this.onSuccess(this.internalAttMap)
          }
        }
      }
      catch (error)
      {
        this.showErrorMsg(`更新失败：${error.message}`)
        if (this.onError)
        {
          this.onError(error, error.stack)
        }
        throw error
      }
      finally
      {
        this.isLoading = false
      }
    },
  
    /**
     * 提交后处理
     * @param {Object} response 响应数据
     * @returns {Promise<void>}
     */
    async afterCommit(response)
    {
      // 更新表单数据
      this.internalAttMap = { ...response }

      // 保存临时文件
      if (this.internalFileController && this.internalAttMap.id)
      {
        await this.internalFileController.saveTempFile(this.internalAttMap.id)
      }

      // 缓存表单数据
      if (this.isCache)
      {        
        this.attMapStrategyHandler.saveCacheData({attMap: this.internalAttMap})
      }

      // 触发成功回调
      if (this.onSuccess)
      {
        this.onSuccess(this.internalAttMap)
      }
      // 触发成功事件
      this.$emit('success', this.internalAttMap)
    }
  }
}
